using System;
using System.Security.Cryptography;
using System.Text;

namespace BrasilFramework.Comum.Seguranca
{
    /// <summary>
    /// Tipo de Hash.
    /// </summary>
    public enum TipoHash
    {
        SHA1 = 0,
        SHA256 = 1,
        SHA384 = 2,
        SHA512 = 3,
        MD5 = 4
    }

    /// <summary>
    /// Implementa o Hash.
    /// </summary>
    public class Hash
    {
        private readonly HashAlgorithm hash;

        /// <summary>
        /// Construtor da classe Hash.
        /// </summary>
        /// <param name="tipo">Tipo de hash.</param>
        public Hash(TipoHash tipo)
        {
            switch (tipo)
            {
                case TipoHash.SHA1:
                    hash = new SHA1Managed();
                    break;
                case TipoHash.SHA256:
                    hash = new SHA256Managed();
                    break;
                case TipoHash.SHA384:
                    hash = new SHA384Managed();
                    break;
                case TipoHash.SHA512:
                    hash = new SHA512Managed();
                    break;
                case TipoHash.MD5:
                    hash = new MD5CryptoServiceProvider();
                    break;
            }
        }

        /// <summary>
        /// Converte o dado em hash.
        /// </summary>
        /// <param name="dados">Dados a serem convertidos em hash.</param>
        /// <returns>Dados em hash.</returns>
        public byte[] GetHash(byte[] dados)
        {
            return hash.ComputeHash(dados);
        }

        /// <summary>
        /// Converte o texto em hash.
        /// </summary>
        /// <param name="texto">Texto.</param>
        /// <returns>Texto em hash.</returns>
        public string GetUTF8StringHash(string texto)
        {
            byte[] Code = Encoding.UTF8.GetBytes(texto);
            return Convert.ToBase64String(GetHash(Code));
        }
    }
}